package geerpc

import (
	"encoding/json"
	"fmt"
	"geerpc/codec"
	"log"
	"net"
	"time"
)

func startServer(addr chan string) {
	l, err := net.Listen("tcp", ":0")
	if err != nil {
		log.Fatal("network error: ", err)
	}
	log.Println("start rpc server on", l.Addr())
	addr <- l.Addr().String()
	Accept(l)
}

//整体逻辑：
//1. 设置请求响应结构体
//2. 提供编码解码器，编码后的数据流可以是字符也可以是二进制流，解码后是上述结构体
//3. 提供一个服务器，接收 tcp 数据流后，根据请求参数判断需要使用的编码解码器
//4. 客户端也利用上述编码解码器对数据进行编码，发送给客户端
func main() {
	log.SetFlags(0)
	addr := make(chan string)
	go startServer(addr)

	// 上面启动服务器，下面作为客户端发送请求
	conn, _ := net.Dial("tcp", <-addr)
	defer func() { _ = conn.Close() }()

	time.Sleep(time.Second)
	_ = json.NewEncoder(conn).Encode(DefaultOption)
	cc := codec.NewGobCodec(conn)
	for i := 0; i < 5; i++ {
		h := &codec.Header{
			ServiceMethod: "Foo.Sum",
			Seq:           uint64(i),
		}
		// 发送请求
		_ = cc.Write(h, fmt.Sprintf("geerpc req %d", h.Seq))
		// 接受响应数据
		_ = cc.ReadHeader(h)
		var reply string
		_ = cc.ReadBody(&reply)
		log.Println("reply:", reply)
	}
}
